// Simple test program for service provider framework
package org.effectivejava.examples.chapter02.item01;

/**
 * 扩展内容：服务提供者框架的四个组件（如JDBC API）多个服务提供者（Provider）实现一个服务，为多个客户端提供多个实现，从多个实现中解耦：
 * 1、服务接口（向外暴漏的服务）,见Service接口
 * 2、提供者注册API，见Services中的registerXX()方法
 * 3、服务访问API，见Services中的newInstance()方法
 * 4、服务提供者接口（具体服务的提供者），见Provider接口
 *
 * 大致思路：
 * 1、先注册服务，再调用服务
 * 2、注册之前先实例化服务（实现Provider接口），作为参数注册（放到map中）
 * 3、如果没注册（map中没有），则实例化（调用Provider的匿名实现类）
 */
public class Test {
	public static void main(String[] args) {
		// Providers would execute these lines
		Services.registerDefaultProvider(DEFAULT_PROVIDER);
		Services.registerProvider("comp", COMP_PROVIDER);
		Services.registerProvider("armed", ARMED_PROVIDER);

		// Clients would execute these lines
		Service s1 = Services.newInstance();
		Service s2 = Services.newInstance("comp");
		Service s3 = Services.newInstance("armed");
		System.out.printf("%s, %s, %s%n", s1, s2, s3);
	}

	// 实现Provider接口
	private static Provider DEFAULT_PROVIDER = new Provider() {
		public Service newService() {
			return new Service() {
				@Override
				public String toString() {
					return "Default service";
				}
			};
		}
	};

	// 实现Provider接口（补充服务）
	private static Provider COMP_PROVIDER = new Provider() {
		public Service newService() {
			return new Service() {
				@Override
				public String toString() {
					return "Complementary service";
				}
			};
		}
	};

	// 实现Provider接口（武装部队）
	private static Provider ARMED_PROVIDER = new Provider() {
		public Service newService() {
			return new Service() {
				@Override
				public String toString() {
					return "Armed service";
				}
			};
		}
	};
}
